﻿using System.Runtime.CompilerServices;
using System.Data;
using Negocio.View.Base;
using System;
using Negocio.Generico;

namespace Negocio.View
{
    public class AlumnoView : ViewBase
    {
        #region Singleton


        /// <summary>
        /// Instancia de objeto estatica
        /// </summary>
        private static AlumnoView instance;


        /// <summary>
        /// Constructor vacio
        /// </summary>
        private AlumnoView()
        {
            //Vacio
        }

        /// <summary>
        /// Funcion que nos dara funcionalidad a nuestro patron singleton
        /// </summary>
        /// <returns></returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static AlumnoView GetInstance()
        {
            if (instance == null)
            {
                instance = new AlumnoView();
            }
            return instance;
        }

        #endregion

        #region Constantes

        /// <summary>
        /// Codigo del alumno
        /// </summary>
        private const string CODIGOALUMNO = "CODIGOALUMNO";

        /// <summary>
        /// Codigo de la persona asociada a ese alumno
        /// </summary>
        private const string CODIGOPERSONA = "CODIGOPERSONA";

        /// <summary>
        /// Año de matriculacion de la persona
        /// </summary>
        private const string AÑOMATRICULACION = "AÑOMATRICULACION";


        /// <summary>
        /// Codigo de la asignatura
        /// </summary>
        private const string CODIGOASIGNATURA = "CODIGOASIGNATURA";

        /// <summary>
        /// Nombre
        /// </summary>
        private const string NOMBRE = "NOMBRE";

        /// <summary>
        /// Apellido 1 de la persona
        /// </summary>
        private const string APELLIDO1 = "APELLIDO1";


        /// <summary>
        /// Apellido 2 de la persona
        /// </summary>
        private const string APELLIDO2 = "APELLIDO2";

        /// <summary>
        /// DNI de la persona
        /// </summary>
        private const string DNI = "DNI";

        #endregion

        #region View

        /// <summary>
        /// Obtiene un listado de alumnos completo sin filtro
        /// </summary>
        /// <returns>Dataview con el listado de alumnos por completo</returns>
        public DataView GetViewAlumnos() 
        {
            return this.GetViewAlumnos(new AlumnoDTO());
        }

        /// <summary>
        /// Funcion que nos devuelve un Dataview con todos los datos rellenos
        /// </summary>
        /// <returns>Vista de datos para poder ser representada en los grids de la vista</returns>
        public DataView GetViewAlumnos(AlumnoDTO filtro)
        {
            try
            {
                DataView dv = new DataView();
                DataTable dt = new DataTable();

                dt.Columns.Add(AlumnoView.CODIGOALUMNO, this.GetTypeSqlInt32);
                dt.Columns.Add(AlumnoView.CODIGOPERSONA, this.GetTypeSqlInt32);
                dt.Columns.Add(AlumnoView.AÑOMATRICULACION, this.GetTypeSqlDateTime);
                dt.Columns.Add(AlumnoView.CODIGOASIGNATURA, this.GetTypeSqlInt32);
                dt.Columns.Add(AlumnoView.NOMBRE, this.GetTypeString);
                dt.Columns.Add(AlumnoView.APELLIDO1, this.GetTypeString);
                dt.Columns.Add(AlumnoView.APELLIDO2, this.GetTypeString);
                dt.Columns.Add(AlumnoView.DNI, this.GetTypeString);

                using (Negocio.Generico.ContratoGenericoClient servicio = new Negocio.Generico.ContratoGenericoClient())
                {
                    foreach (AlumnoDTO bean in servicio.Get(filtro))
                    {
                        DataRow fila = dt.NewRow();
                        fila[AlumnoView.CODIGOALUMNO] = bean.CoAlumno;
                        fila[AlumnoView.CODIGOPERSONA] = bean.CoPersona;
                        fila[AlumnoView.AÑOMATRICULACION] = bean.AñoMatriculacion == null ? DateTime.Now : bean.AñoMatriculacion;
                        fila[AlumnoView.CODIGOASIGNATURA] = bean.CoAsignatura==null? Int32.MinValue:bean.CoAsignatura;
                        fila[AlumnoView.NOMBRE] = bean.Nombre;
                        fila[AlumnoView.APELLIDO1] = bean.Apellido1;
                        fila[AlumnoView.APELLIDO2] = bean.Apellido2;
                        fila[AlumnoView.DNI] = bean.DNI;
                        dt.Rows.Add(fila);
                    }
                }
                return dt.DefaultView;
            }
            catch (Exception ex)
            {
                throw new ViewException(ex);
            }
        }


        public void InsertaAlumno(AlumnoDTO Alumno)
        {
            try
            {
                using (ContratoGenericoClient servicio = new ContratoGenericoClient())
                {
                    servicio.Insert(Alumno);
                }
            }
            catch (Exception ex)
            {
                throw new ViewException(ex);
            }
        }


        /// <summary>
        /// Metodo que actualiza una Alumno
        /// </summary>
        /// <param name="Alumno">Alumno a actualizar</param>
        public void ActualizaAlumno(AlumnoDTO Alumno)
        {
            try
            {
                using (ContratoGenericoClient servicio = new ContratoGenericoClient())
                {
                    servicio.Update(Alumno);
                }
            }
            catch (Exception ex)
            {
                throw new ViewException(ex);
            }
        }


        #endregion
    }
}